package com.lyrcsoft.beanpostprocessors;

import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * 「实例化」：实例化是创建类的实例的过程。
 * 在Spring中，当一个Bean被定义在配置文件中（或者通过其他方式如注解或Java配置），
 * Spring IoC容器就会实例化这个Bean。实例化通常通过调用类的无参数构造函数来完成。
 * 这个步骤产生了一个Bean的实例，但是这个实例的属性尚未被设置。
 * <p>
 * 「初始化」：初始化是在Bean实例化后、使用前的一个阶段，
 * 主要是对Bean进行一些定制化的设置，比如设置属性的值、执行某些方法等
 *
 * @author fujc-dev@qq.com
 * @date 2023/7/3 13:14
 */
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
	//BeanPostProcessor
	//InstantiationAwareBeanPostProcessor


	@Override
	public Object postProcessBeforeInstantiation(@NotNull Class<?> beanClass, @NotNull String beanName) throws BeansException {
		// Before Instantiation
		// 默认返回null
		if (beanName.equals("userService")) {
			// Spring没有对返回的对象的类型进行验证
			//return  new User();
			// 如果返回了一个对象，那么后面的步骤就不会走了
		}
		return null;
	}

	@Override
	public boolean postProcessAfterInstantiation(@NotNull Object bean, @NotNull String beanName) throws BeansException {
		//After Instantiation
		return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
	}

	@Override
	public PropertyValues postProcessProperties(@NotNull PropertyValues pvs, @NotNull Object bean, @NotNull String beanName) throws BeansException {
		// Properties
		// 真正的处理我们的@Autowired @Resource @Value注解
		return InstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
	}

	@Override
	public Object postProcessBeforeInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
		// Before Initialization 初始化前
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
		//After Initialization 初始化后
		return bean;
	}
}
